package com.wenx.v3openfeign.api;

import com.wenx.v3core.response.R;
import com.wenx.v3openfeign.api.fallback.PlatformUserRemoteInfraFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 平台用户远程服务接口
 * 
 * 通过 OpenFeign 暴露平台用户相关的服务接口，供认证服务调用
 * 支持多种查询方式：用户名、邮箱、手机号
 */
@FeignClient(
    name = "v3-system",
    contextId = "platformUser",
    path = "/api/v3/platform/user/remote",
    fallbackFactory = PlatformUserRemoteInfraFallbackFactory.class
)
public interface PlatformUserRemoteInfra {

    /**
     * 根据标识符获取平台用户认证信息
     * 自动识别并按优先级查询：用户名 > 邮箱 > 手机号
     * 
     * @param identifier 用户标识符（可以是用户名、邮箱、手机号等）
     * @return 平台用户认证信息
     */
    @GetMapping("/auth-info")
    R getPlatformUserAuthInfo(@RequestParam("identifier") String identifier);

    /**
     * 根据用户名获取平台用户认证信息
     * 
     * @param username 用户名
     * @return 平台用户认证信息
     */
    @GetMapping("/auth-info/by-username/{username}")
    R getPlatformUserAuthInfoByUsername(@PathVariable("username") String username);

    /**
     * 根据邮箱获取平台用户认证信息
     * 
     * @param email 邮箱地址
     * @return 平台用户认证信息
     */
    @GetMapping("/auth-info/by-email")
    R getPlatformUserAuthInfoByEmail(@RequestParam("email") String email);

    /**
     * 根据手机号获取平台用户认证信息
     * 
     * @param phone 手机号
     * @return 平台用户认证信息
     */
    @GetMapping("/auth-info/by-phone")
    R getPlatformUserAuthInfoByPhone(@RequestParam("phone") String phone);

    /**
     * 获取平台用户的所有权限标识
     * 
     * @param userId 用户ID
     * @return 权限标识集合
     */
    @GetMapping("/permissions/{userId}")
    R getPlatformUserPermissions(@PathVariable("userId") Long userId);

    /**
     * 获取平台用户的所有角色编码
     * 
     * @param userId 用户ID
     * @return 角色编码集合
     */
    @GetMapping("/roles/{userId}")
    R getPlatformUserRoles(@PathVariable("userId") Long userId);

    /**
     * 获取平台用户的菜单编码
     * 
     * @param userId 用户ID
     * @return 菜单编码集合
     */
    @GetMapping("/menus/{userId}")
    R getPlatformUserMenus(@PathVariable("userId") Long userId);

    /**
     * 验证平台用户账户状态
     * 
     * @param userId 用户ID
     * @return 账户是否激活
     */
    @GetMapping("/account-status/{userId}")
    R isPlatformAccountActive(@PathVariable("userId") Long userId);

    /**
     * 获取平台用户可访问的租户
     * 
     * @param userId 用户ID
     * @return 可访问的租户ID集合
     */
    @GetMapping("/accessible-tenants/{userId}")
    R getPlatformUserAccessibleTenants(@PathVariable("userId") Long userId);

    /**
     * 平台用户认证
     * 
     * @param identifier 用户标识符
     * @param password 密码
     * @return 认证结果
     */
    @PostMapping("/auth/authenticate")
    R authenticatePlatformUser(@RequestParam("identifier") String identifier, @RequestParam("password") String password);
}